package com.netx.cubigraf.entities;
import com.netx.generics.basic.Checker;
import com.netx.generics.basic.IntegrityException;
import com.netx.generics.time.Date;
import com.netx.generics.sql.Table;
import com.netx.generics.sql.Row;
import com.netx.data.Entity;
import com.netx.data.Connection;
import com.netx.data.ValueList;
import com.netx.data.DatabaseException;


public class GestaoPelicula extends Entity {

	public GestaoPelicula() {
		super();
	}

	public void criarLinhaPara(Date data) throws DatabaseException {
		ValueList values = new ValueList();
		values.addValue("ano", data.getYear());
		values.addValue("mes", data.getMonth());
		insert(values);
		// Actualizar tambem a linha anterior, para garantir
		// que o valor de "pelicula gasta" contabiliza todos
		// os servicos efectuados ate ao fim do mes anterior:
		final ComprasPelicula cp = Entities.getComprasPelicula(getConnection());
		final Date anterior = data.clone().setMonth(data.getMonth()-1);
		int result = actualizarLinha(anterior, cp);
		// result pode ser 0 se nao houver mes anterior:
		if(result != 1 && result != 0) {
			throw new IntegrityException(result);
		}
	}

	// Regista o valor de sobra, e actualiza os valores de
	// "pelicula gasta" e "pelicula comprada":
	public void registarSobra(Date data, double sobra56, double sobra76, double sobra91) throws DatabaseException {
		Checker.checkNull(data, "data");
		Checker.checkMinValue((int)sobra56, 0, "sobra56");
		Checker.checkMinValue((int)sobra76, 0, "sobra76");
		Checker.checkMinValue((int)sobra91, 0, "sobra91");
		Connection c = getConnection();
		synchronized(c) {
			startTransaction();
			ValueList values = new ValueList();
			values.addValue("sobra56", sobra56);
			values.addValue("sobra76", sobra76);
			values.addValue("sobra91", sobra91);
			int result = update(values, "ano="+data.getYear()+" and mes="+data.getMonth());
			if(result != 1) {
				throw new IntegrityException(result);
			}
			// Actualizar os valores de pelicula comprada e gasta:
			ComprasPelicula cp = Entities.getComprasPelicula(getConnection());
			result = actualizarLinha(data, cp);
			if(result != 1) {
				throw new IntegrityException(result);
			}
			commit();
		}
	}

	// For self and ComprasPelicula:
	int actualizarLinha(Date data, ComprasPelicula cp) throws DatabaseException {
		final ValueList values = new ValueList();
		// Calcular a pelicula gasta:
		double peliculaGasta = getConnection().select("sum(largura/100 * altura/100) from servicos where data_print is not null and year(data_print)="+data.getYear()+" and month(data_print)="+data.getMonth()+" and tipo in ('o', 'e', 'r')").getDouble(1, 0);
		values.addValue("pelicula_gasta", peliculaGasta);
		// Calcular a pelicula comprada:
		Table compras = cp.verComprasPelicula(data);
		if(compras.isEmpty()) {
			values.addValue("pelicula_comprada", new Double(0));
		}
		else {
			values.addValue("pelicula_comprada", cp.verAreaComprada(data).getDouble(1, 0));
		}
		return update(values, "ano="+data.getYear()+" and mes="+data.getMonth());
	}

	public Row verInfoPelicula(Date data) throws DatabaseException {
		Checker.checkNull(data, "data");
		Table t = select("ano, mes, sobra56, sobra76, sobra91, sobra56*0.56 + sobra76*0.76 + sobra91*0.91 AS sobra, pelicula_comprada, pelicula_gasta", "ano="+data.getYear()+" AND mes="+data.getMonth());
		if(t.isEmpty()) {
			return null;
		}
		else {
			return t.getRow(0);
		}
	}

	public Table verInfoPelicula() throws DatabaseException {
		return select("ano, mes, sobra56, sobra76, sobra91, sobra56*0.56 + sobra76*0.76 + sobra91*0.91 AS sobra, pelicula_comprada, pelicula_gasta");
	}
	
	public void zerar() throws DatabaseException {
		this.delete("1=1");
	}
}
